home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / graph3D / graph3D source / lineAsm.c < prev    next >
Text File  |  1993-09-17  |  2KB  |  145 lines

  1. /*
  2.     Copyright '89    Christopher Moll
  3.     all rights reserved
  4. */
  5.  
  6.  
  7. #ifdef    _LSC3_
  8. #    include <ColorToolbox.h>
  9. #endif
  10.  
  11. extern    Boolean            colorQD;
  12. extern    WindowPtr        graphWind;
  13. extern    Boolean        grphOnScrn;
  14.  
  15. static    int    top, left, scrnRowBytes;
  16. static    Point    *grphPnLoc;
  17.  
  18. void    Aline(...);
  19.  
  20.  
  21. CheckGrphWind()
  22. {
  23.     int    bottom, right;
  24.     Boolean        ScrnHasColor();
  25.     Rect    *bBox;
  26.  
  27.     if (colorQD)
  28.     {
  29.         top = -(*(((CGrafPtr)graphWind)->portPixMap))->bounds.top;
  30.         left = -(*(((CGrafPtr)graphWind)->portPixMap))->bounds.left;
  31.         grphPnLoc = &(((CGrafPtr)graphWind)->pnLoc);
  32.     }
  33.     else
  34.     {
  35.         top = -graphWind->portBits.bounds.top;
  36.         left = -graphWind->portBits.bounds.left;
  37.         grphPnLoc = &(graphWind->pnLoc);
  38.     }
  39.     bBox = &((**(((WindowPeek)graphWind)->contRgn)).rgnBBox);
  40.     bottom = bBox->bottom;
  41.     right = bBox->right;
  42.  
  43.     grphOnScrn = ((bottom < screenBits.bounds.bottom)
  44.         && (right < screenBits.bounds.right))
  45.         && (left > 0);
  46.  
  47.     scrnRowBytes = screenBits.rowBytes;
  48. }
  49.  
  50. pascal void
  51. MLineTo(end)
  52. Point    end;
  53. {
  54.     Point    start;
  55. return;
  56.     start = *grphPnLoc;
  57.     *grphPnLoc = end;
  58.     end.h += left;
  59.     end.v += top;
  60.     start.h += left;
  61.     start.v += top;
  62. if ((end.h > 1024) || (start.h > 1024))
  63. {
  64. MoveTo(start.h, start.v);
  65. LineTo(end.h, end.v);
  66. }
  67. else
  68.     Aline(start.h, start.v, end.h, end.v);
  69. }
  70.  
  71. static
  72. void
  73. Aline()
  74. {
  75. asm{
  76.     link    a6,#0
  77.  
  78.     MOVEM.L D0-D7/A0-A1,-(A7)
  79.     MOVE.W    8(a6),d4
  80.     CLR.L    d5
  81.     MOVE.W    10(a6),d5
  82.     MOVE.W    12(a6),d6
  83.     MOVE.W    14(a6),d7
  84.     CMP.W   D6,D4
  85.     BLS.S   @lah_1
  86.     EXG     D6,D4
  87.     EXG     D7,D5
  88. lah_1:    MOVE    D6,D2
  89.     SUB     D4,D2
  90.     MOVE    D7,D3
  91.     SUB     D5,D3
  92.     MOVE    scrnRowBytes,D6
  93.     CMP.W   D7,D5
  94.     BLS.S   @lah_2
  95.     NEG     D6
  96.     NEG     D3
  97. lah_2:    MULS    scrnRowBytes,D5
  98.     MOVE.L  0x824,A0
  99.     ADDA.L  D5,A0
  100.     MOVE    D4,D0
  101.     LSR     #3,D0
  102.     ANDI    #0x7E,D0
  103.     ADDA.W  D0,A0
  104.     LSL     #1,D4
  105.     ANDI    #0x1E,D4
  106.     LEA     @masks,a1
  107.     ADD    d4,a1
  108.     MOVE    (a1),d0
  109.     CMP.W   D3,D2
  110.     BHI.S   @lah_6
  111.     MOVE    D3,D1
  112.     MOVE    D3,D7
  113. lah_3:    OR      D0,(A0)
  114.     SUB     D2,D1
  115.     BLS.S   @lah_5
  116. lah_4:    ADDA.W  D6,A0
  117.     DBF     D7,@lah_3
  118.     MOVEM.L (A7)+,D0-D7/A0
  119.     UNLK    A6
  120.     RTS     
  121. lah_5:    ADD     D3,D1
  122.     ROR     #1,D0
  123.     BCC     @lah_4
  124.     ADDQ.L  #2,A0
  125.     BRA     @lah_4
  126. lah_6:    MOVE    D2,D1
  127.     MOVE    D2,D7
  128. lah_7:    OR      D0,(A0)
  129.     SUB     D3,D1
  130.     BLS.S   @lah_10
  131. lah_8:    ROR     #1,D0
  132.     BCC.S   @lah_9
  133.     ADDQ.L  #2,A0
  134. lah_9:    DBF     D7,@lah_7
  135.     MOVEM.L (A7)+,D0-D7/A0
  136.     UNLK    A6
  137.     RTS     
  138. lah_10:    ADD     D2,D1
  139.     ADDA.W  D6,A0
  140.     BRA     @lah_8
  141.  
  142. masks:    DC.W    0x8000,0x4000,0x2000,0x1000,0x800,0x400,0x200,0x100
  143.     DC.W    0x80,0x40,0x20,0x10,8,4,2,1
  144. }
  145. }